package com.cencat.order.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 司机信息数据传输对象
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@Accessors(chain = true)
public class DriverDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 司机ID(更新时必填)
     */
    private Long driverId;

    /**
     * 司机编号
     */
    @Size(max = 50, message = "司机编号长度不能超过50个字符")
    private String driverCode;

    /**
     * 司机姓名
     */
    @NotBlank(message = "司机姓名不能为空")
    @Size(max = 50, message = "司机姓名长度不能超过50个字符")
    private String driverName;

    /**
     * 手机号码
     */
    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phoneNumber;

    /**
     * 身份证号
     */
    @NotBlank(message = "身份证号不能为空")
    @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$", message = "身份证号格式不正确")
    private String idCard;

    /**
     * 驾驶证号
     */
    @NotBlank(message = "驾驶证号不能为空")
    @Size(max = 50, message = "驾驶证号长度不能超过50个字符")
    private String licenseNumber;

    /**
     * 驾驶证类型
     */
    @NotBlank(message = "驾驶证类型不能为空")
    @Size(max = 10, message = "驾驶证类型长度不能超过10个字符")
    private String licenseType;

    /**
     * 驾驶证有效期
     */
    @NotNull(message = "驾驶证有效期不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime licenseExpiry;

    /**
     * 车牌号
     */
    @NotBlank(message = "车牌号不能为空")
    @Size(max = 20, message = "车牌号长度不能超过20个字符")
    private String vehicleNumber;

    /**
     * 车辆类型
     */
    @NotBlank(message = "车辆类型不能为空")
    @Size(max = 50, message = "车辆类型长度不能超过50个字符")
    private String vehicleType;

    /**
     * 载重量(吨)
     */
    @NotNull(message = "载重量不能为空")
    @DecimalMin(value = "0.1", message = "载重量不能小于0.1吨")
    @DecimalMax(value = "100.0", message = "载重量不能大于100吨")
    private BigDecimal loadCapacity;

    /**
     * 司机状态(0-离线 1-在线 2-忙碌 3-休息)
     */
    @Min(value = 0, message = "司机状态值不正确")
    @Max(value = 3, message = "司机状态值不正确")
    private Integer driverStatus;

    /**
     * 当前位置经度
     */
    @DecimalMin(value = "-180.0", message = "经度值不正确")
    @DecimalMax(value = "180.0", message = "经度值不正确")
    private BigDecimal currentLongitude;

    /**
     * 当前位置纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度值不正确")
    @DecimalMax(value = "90.0", message = "纬度值不正确")
    private BigDecimal currentLatitude;

    /**
     * 当前位置地址
     */
    @Size(max = 200, message = "当前位置地址长度不能超过200个字符")
    private String currentAddress;

    /**
     * 认证状态(0-未认证 1-认证中 2-已认证 3-认证失败)
     */
    @Min(value = 0, message = "认证状态值不正确")
    @Max(value = 3, message = "认证状态值不正确")
    private Integer authStatus;

    /**
     * 头像
     */
    @Size(max = 200, message = "头像路径长度不能超过200个字符")
    private String avatar;

    /**
     * 性别(1-男 2-女)
     */
    @Min(value = 1, message = "性别值不正确")
    @Max(value = 2, message = "性别值不正确")
    private Integer gender;

    /**
     * 年龄
     */
    @Min(value = 18, message = "年龄不能小于18岁")
    @Max(value = 65, message = "年龄不能大于65岁")
    private Integer age;

    /**
     * 紧急联系人
     */
    @Size(max = 50, message = "紧急联系人长度不能超过50个字符")
    private String emergencyContact;

    /**
     * 紧急联系电话
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "紧急联系电话格式不正确")
    private String emergencyPhone;

    /**
     * 家庭住址
     */
    @Size(max = 200, message = "家庭住址长度不能超过200个字符")
    private String homeAddress;

    /**
     * 银行卡号
     */
    @Size(max = 30, message = "银行卡号长度不能超过30个字符")
    private String bankCardNumber;

    /**
     * 开户行
     */
    @Size(max = 100, message = "开户行长度不能超过100个字符")
    private String bankName;

    /**
     * 开户人
     */
    @Size(max = 50, message = "开户人长度不能超过50个字符")
    private String accountHolder;

    /**
     * 入职时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime joinTime;

    /**
     * 工作经验(年)
     */
    @Min(value = 0, message = "工作经验不能小于0年")
    @Max(value = 50, message = "工作经验不能大于50年")
    private Integer workExperience;

    /**
     * 技能标签(多个用逗号分隔)
     */
    @Size(max = 200, message = "技能标签长度不能超过200个字符")
    private String skillTags;

    /**
     * 服务区域
     */
    @Size(max = 200, message = "服务区域长度不能超过200个字符")
    private String serviceArea;

    /**
     * 是否接受夜间配送
     */
    private Boolean acceptNightDelivery;

    /**
     * 是否接受长途配送
     */
    private Boolean acceptLongDistanceDelivery;

    /**
     * 最大配送距离(公里)
     */
    @DecimalMin(value = "1.0", message = "最大配送距离不能小于1公里")
    @DecimalMax(value = "1000.0", message = "最大配送距离不能大于1000公里")
    private BigDecimal maxDeliveryDistance;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    private String extField3;
}